코딩테스트 연습 - 3진법 뒤집기 | 프로그래머스 스쿨
[ 템플릿 코드 ]
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
return answer;
}[ 풀이 ]
int solution(int n)
{
string s = "";
while (n > 0)
{
s += (n % 3) + '0';
n /= 3;
}
int answer = 0;
for (char c : s)
{
answer = answer * 3 + (c - '0');
}
return answer;
}[ 해설 ]
int solution(int n)
{
// 3진수를 저장할 문자열
// 나머지를 순서대로 넣기 때문에 뒤집힌 3진수가 저장된다.
string s = "";
// n이 0이 될 때까지 반복
while (n > 0)
{
// n을 3으로 나눈 나머지를 구한다.
// + '0'을 해서 숫자를 문자('0', '1', '2')로 변환한다.
// 예) 2 + '0' -> '2'
//
// 45일 경우
// 45 % 3 = 0 -> s = "0"
// 15 % 3 = 0 -> s = "00"
// 5 % 3 = 2 -> s = "002"
// 1 % 3 = 1 -> s = "0021"
//
// 결과적으로 원래 3진수(1200)가 아닌
// 뒤집힌 3진수(0021)가 저장된다.
s += (n % 3) + '0';
// 다음 자릿수를 계산하기 위해 3으로 나눈 몫을 저장
//
// 45 -> 15
// 15 -> 5
// 5 -> 1
// 1 -> 0
n /= 3;
}
// 최종 결과(10진수)를 저장할 변수
int answer = 0;
// 문자열에 저장된 뒤집힌 3진수를 한 글자씩 확인
for (char c : s)
{
// 문자 숫자를 실제 숫자로 변환
//
// '0' - '0' = 0
// '1' - '0' = 1
// '2' - '0' = 2
//
// answer * 3 은 현재 값을 한 자리 왼쪽으로 이동시키는 것과 같다.
//
// 예) s = "0021"
//
// 첫 번째 문자 '0'
// answer = 0 * 3 + 0 = 0
//
// 두 번째 문자 '0'
// answer = 0 * 3 + 0 = 0
//
// 세 번째 문자 '2'
// answer = 0 * 3 + 2 = 2
//
// 네 번째 문자 '1'
// answer = 2 * 3 + 1 = 7
//
// 최종 결과 = 7
answer = answer * 3 + (c - '0');
}
// 계산된 10진수 결과 반환
return answer;
}[ 타 답안 ]
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
// 최종 결과를 저장할 변수
int answer = 0;
// 3진수의 각 자릿수를 저장할 벡터
vector<int> v;
// n을 3진수로 변환
while(n > 0){
// 3으로 나눈 나머지를 벡터에 저장
//
// 예) n = 45
// 45 % 3 = 0 -> [0]
// 15 % 3 = 0 -> [0, 0]
// 5 % 3 = 2 -> [0, 0, 2]
// 1 % 3 = 1 -> [0, 0, 2, 1]
//
// 이미 뒤집힌 형태로 저장된다.
v.push_back(n % 3);
// 다음 자릿수 계산을 위해 3으로 나눈 몫 저장
n /= 3;
}
// 현재 자릿값
//
// 3^0 = 1
// 3^1 = 3
// 3^2 = 9
// ...
int k = 1;
// 벡터가 빌 때까지 반복
while(!v.empty()) {
// 벡터의 마지막 원소를 꺼내 사용
//
// [0,0,2,1]
// 처음에는 1
answer += k * v.back();
// 사용한 마지막 원소 제거
v.pop_back();
// 다음 자릿수로 이동
//
// 1 -> 3 -> 9 -> 27 ...
k *= 3;
}
return answer;
}